package com.example.zzh.utils;

/**
 * 功能描述
 *
 * @author: ZhangZhenHao
 * @date: 2023年08月07日 17:09
 */
import com.example.zzh.entity.ZzhStaff;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtTokenUtils {
    private static final String SECRET_KEY = "root"; // 设置JWT的秘钥
    private static final long EXPIRATION_TIME =1000*60*60*24;//表示有效期为24h


    public static String generateJwtToken(ZzhStaff zzhStaff){
        Map<String, Object> headMap = new HashMap<>();
        headMap.put("alg", "HS256");//使用签名算法HS256
        headMap.put("typ", "JWT");
        Map<String, Object> claims = new HashMap<>();
        // 添加自定义的声明信息
        claims.put("id",zzhStaff.getId());
        claims.put("username", zzhStaff.getUsername());
        claims.put("position",zzhStaff.getPosition());

        return Jwts.builder()
                .setHeader(headMap) //设置头
                .setClaims(claims) //设置主体
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 设置过期事件
                .signWith(SignatureAlgorithm.HS512, SECRET_KEY) // 使用HS512算法进行签名
                .compact(); //把三部分拼接起来
    }

    /**
     * 验证JWT的有效性
     *
     * @param token JWT
     * @return 验证结果，true表示有效，false表示无效
     */
    public static boolean validateJwtToken(String token) {
        try {
            Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token); // 使用秘钥解析JWT，如果解析失败会抛出异常
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 从JWT中获取用户名
     *
     * @param token JWT
     * @return 用户名
     */
    public static String getUsernameFromJwtToken(String token) {
        Claims claims = Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();

        return (String) claims.get("username");
    }
}